<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script>window.enablePixelTesting = true;</script>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<svg id="svg" xmlns="http://www.w3.org/2000/svg" width="200" height="200">
    <polyline id="poly1" stroke="green" points="0 0 100 0 100 100 0 100"/>
</svg>

<p id="description"></p>
<div id="console"></div>
<script type="text/javascript">
<![CDATA[
    description("This is a test of the simple SVGPointList API parts.");

    if (window.testRunner)
        testRunner.dumpAsText();

    // Extend String prototype, to offer a function, that formats the points attribute in the same way across browsers
    String.prototype.formatPointsAttribute = function() {
        return this.replace(/,/g, " "); // Remove Firefox commas
    }

    function dumpPoint(point) {
        return "x=" + point.x.toFixed(0) + " y=" + point.y.toFixed(0);
    }

    var svg = document.getElementById("svg");
    var poly1 = document.getElementById("poly1");
    shouldBe("poly1.points.numberOfItems", "4");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(2))", "x=100 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(3))", "x=0 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "0 0 100 0 100 100 0 100");

    var point;
    debug("");
    debug("Creating point x=200 y=100");
    shouldBeEqualToString("(point = svg.createSVGPoint()).toString()", "[object SVGPoint]");
    shouldBe("point.x = 200", "200");
    shouldBe("point.y = 100", "100");

    debug("");
    debug("Test uncommon arguments for initialize()");
    shouldBe("poly1.points.initialize(point)", "point");
    shouldBe("poly1.points.numberOfItems", "1");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=200 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "200 100");
    shouldThrow("poly1.points.initialize(poly1)");
    shouldThrow("poly1.points.initialize(0)");
    shouldThrow("poly1.points.initialize('aString')");

    debug("");
    debug("Reset points attribute to 0 0 100 0 100 100 0 100");
    shouldBeUndefined("poly1.setAttribute('points', '0 0 100 0 100 100 0 100')");
    shouldBe("poly1.points.numberOfItems", "4");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(2))", "x=100 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(3))", "x=0 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "0 0 100 0 100 100 0 100");

    debug("");
    debug("Test uncommon arguments for getItem()");
    shouldThrow("poly1.points.getItem(30)");
    shouldBe("poly1.points.getItem('aString')", "poly1.points.getItem(0)");
    shouldBe("poly1.points.getItem(poly1)", "poly1.points.getItem(0)");
    shouldBe("poly1.points.getItem(null)", "poly1.points.getItem(0)");

    debug("");
    debug("Test uncommon arguments for insertItemBefore()");
    shouldThrow("poly1.points.insertItemBefore(30)");
    shouldThrow("poly1.points.insertItemBefore('aString')");
    shouldThrow("poly1.points.insertItemBefore(poly1)");
    shouldThrow("poly1.points.insertItemBefore(null)");

    shouldBeEqualToString("dumpPoint(poly1.points.insertItemBefore(poly1.points.getItem(1), 'aString'))", "x=100 y=0");
    shouldBe("poly1.points.numberOfItems", "5");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(2))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(3))", "x=100 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(4))", "x=0 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "100 0 0 0 100 0 100 100 0 100");
    
    shouldBeEqualToString("dumpPoint(poly1.points.insertItemBefore(poly1.points.getItem(1), poly1))", "x=0 y=0");
    shouldBe("poly1.points.numberOfItems", "6");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(2))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(3))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(4))", "x=100 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(5))", "x=0 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "0 0 100 0 0 0 100 0 100 100 0 100");

    shouldBeEqualToString("dumpPoint(poly1.points.insertItemBefore(poly1.points.getItem(1), null))", "x=100 y=0");
    shouldBe("poly1.points.numberOfItems", "7");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(2))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(3))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(4))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(5))", "x=100 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(6))", "x=0 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "100 0 0 0 100 0 0 0 100 0 100 100 0 100");
    
    shouldBeEqualToString("dumpPoint(poly1.points.insertItemBefore(poly1.points.getItem(1), 0))", "x=0 y=0");
    shouldBe("poly1.points.numberOfItems", "8");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(2))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(3))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(4))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(5))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(6))", "x=100 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(7))", "x=0 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "0 0 100 0 0 0 100 0 0 0 100 0 100 100 0 100");
    
    shouldThrow("poly1.points.insertItemBefore(30, 0)");
    shouldThrow("poly1.points.insertItemBefore('aString', 0)");
    shouldThrow("poly1.points.insertItemBefore(poly1, 0)");
    shouldThrow("poly1.points.insertItemBefore(null, 0)");

    debug("");
    debug("Test uncommon arguments for replaceItem()");
    shouldThrow("poly1.points.replaceItem(30)");
    shouldThrow("poly1.points.replaceItem('aString')");
    shouldThrow("poly1.points.replaceItem(poly1)");
    shouldThrow("poly1.points.replaceItem(null, 0)");
    shouldThrow("poly1.points.replaceItem('aString', 0)");
    shouldThrow("poly1.points.replaceItem(poly1, 0)");
    shouldThrow("poly1.points.replaceItem(1, 0)");

    debug("");
    debug("Test uncommon values for indexed setter");
    shouldThrow("poly1.points[0] = 30");
    shouldThrow("poly1.points[0] = 'aString'");
    shouldThrow("poly1.points[0] = poly1");
    shouldThrow("poly1.points[0] = null");

    debug("");
    debug("Test uncommon arguments for replaceItem() and xml-dom synchronization");
    shouldBe("poly1.points.numberOfItems", "8");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(2))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(3))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(4))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(5))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(6))", "x=100 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(7))", "x=0 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "0 0 100 0 0 0 100 0 0 0 100 0 100 100 0 100");

    shouldBeEqualToString("dumpPoint(poly1.points.replaceItem(poly1.points.getItem(0), 0))", "x=0 y=0");
    shouldBe("poly1.points.numberOfItems", "8");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(2))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(3))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(4))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(5))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(6))", "x=100 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(7))", "x=0 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "0 0 100 0 0 0 100 0 0 0 100 0 100 100 0 100");

    shouldBeEqualToString("dumpPoint(poly1.points.replaceItem(poly1.points.getItem(0), 'aString'))", "x=0 y=0");
    shouldBe("poly1.points.numberOfItems", "8");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(2))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(3))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(4))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(5))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(6))", "x=100 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(7))", "x=0 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "0 0 100 0 0 0 100 0 0 0 100 0 100 100 0 100");

    shouldBeEqualToString("dumpPoint(poly1.points.replaceItem(poly1.points.getItem(0), poly1))", "x=0 y=0");
    shouldBe("poly1.points.numberOfItems", "8");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(2))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(3))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(4))", "x=0 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(5))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(6))", "x=100 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(7))", "x=0 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "0 0 100 0 0 0 100 0 0 0 100 0 100 100 0 100");

    shouldBeEqualToString("dumpPoint(poly1.points.replaceItem(poly1.points.getItem(0), null))", "x=0 y=0");
    shouldBe("poly1.points.numberOfItems", "8");
    shouldBeEqualToString("poly1.getAttribute('points')", "0 0 100 0 0 0 100 0 0 0 100 0 100 100 0 100");

    debug("");
    debug("Reset points attribute to 0 0 100 0 100 100 0 100");
    shouldBeUndefined("poly1.setAttribute('points', '0 0 100 0 100 100 0 100')");

    debug("");
    debug("Test uncommon arguments for removeItem()");
    shouldThrow("poly1.points.removeItem(30)");

    shouldBeEqualToString("dumpPoint(poly1.points.removeItem('aString'))", "x=0 y=0");
    shouldBe("poly1.points.numberOfItems", "3");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=100 y=0");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=100 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=100 y=0");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "100 0 100 100 0 100");

    shouldBeEqualToString("dumpPoint(poly1.points.removeItem(poly1))", "x=100 y=0");
    shouldBe("poly1.points.numberOfItems", "2");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=100 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=0 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "100 100 0 100");

    shouldBeEqualToString("dumpPoint(poly1.points.removeItem(null))", "x=100 y=100");
    shouldBe("poly1.points.numberOfItems", "1");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=0 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "0 100"); 

    debug("");
    debug("Test uncommon arguments for appendItem()");
    // shouldThrow("poly1.points.appendItem(30)");
    // shouldThrow("poly1.points.appendItem('aString')");
    // shouldThrow("poly1.points.appendItem(poly1)");
    // shouldThrow("poly1.points.appendItem(null)");

    shouldBeEqualToString("dumpPoint(poly1.points.appendItem(point))", "x=200 y=100");
    shouldBe("poly1.points.numberOfItems", "2");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=0 y=100");
    shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=200 y=100");
    shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "0 100 200 100");

]]>
</script>
</body>
</html>
